/**
 * @file BaseEncoder.hpp
 * @brief 编解码器基准，为各种设备的硬件加速编解码提供统一抽象
 * @note
 * ## 继承要求
 * 1. 所有类应该继承于`BaseEncoder`
 * 2. 所有类的类名称应该为`Encoder`
 * 3. 头文件应该为`Encoder.hpp`，CMake将根据不同的编译选项动态载入代码库
 * 4. 所有异常应该继承于`std::exception`
 * 5. 仅要求实现SRT-TS协议，不对流格式做要求(架构要求)
 */

#ifndef H264ENCODER_H
#define H264ENCODER_H

#include <string>

/**
 * @class BaseEncoder
 * @brief 编码器基类
 *
 */
class BaseEncoder {
  const std::string uri;

public:
  /**
   * @brief 构造函数
   *
   * @param srturi SRT协议URL
   */
  BaseEncoder(const std::string &srturi) : uri(srturi) {}

  /**
   * @brief 析构函数
   */
  virtual ~BaseEncoder() = default;

  /**
   * @brief 指定图像数据类型
   */
  enum class ImageType {
    GREY, //< 灰度图
    RGB8  //< 8位RGB
  };

  /**
   * @brief 启动编码流
   *
   * @param width 图像宽度
   * @param height 图像高度
   * @param type 数据类型
   */
  virtual void StartStream(int width, int height, const ImageType &type) = 0;

  /**
   * @brief 输入图片
   * @note 如果设备无法立刻处理图片，将会丢弃当前数据
   *
   * @param img 图片数据(不要释放该指针)
   */
  virtual void InputImage(const unsigned char *img) = 0;

  /**
   * @brief 流结束
   */
  virtual void EndStream() = 0;

  /**
   * @brief 获取流状态
   *
   * @return `true`流正在运行,`false`未运行流
   */
  virtual bool GetStatus() = 0;
};

#endif
